﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using PruebaCliente.Soporte;
using System.Configuration;
using System.IO;
using System.Diagnostics;
using PruebaCliente.Transferencia;

namespace PruebaCliente
{
    public partial class Form1 : Form
    {
        private SoporteServiceClient _soporteCliente;
        private TransferenciaServiceClient _transferenciaCliente;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            _soporteCliente = new SoporteServiceClient();
            _transferenciaCliente = new TransferenciaServiceClient();
            Text = ConfigurationManager.AppSettings["Alias"];
        }

        private void tmrComando_Tick(object sender, EventArgs e)
        {
            tmrComando.Stop();

            try
            {
                Comando comando = _soporteCliente.ObtenerComando(ConfigurationManager.AppSettings["Alias"], ConfigurationManager.AppSettings["Nombre"]);
                txtEstado.Text = "Todo en orden " + DateTime.Now.ToString();
                ProcesarComando(comando);
            }
            catch (Exception ex)
            {
                txtEstado.Text = DateTime.Now.ToString() + " [|] ";
                txtEstado.Text += ex.Message;
            }

            tmrComando.Start();
        }

        private void ProcesarComando(Comando comando)
        {
            switch (comando.Tipo)
            {
                case TipoComando.SinAccion:
                    break;

                case TipoComando.SolicitarDrives:
                    MostrarDrives(comando);
                    break;

                case TipoComando.Explorar:
                    Explorar(comando);
                    break;

                case TipoComando.Ejecutar:
                    Ejecutar(comando);
                    break;

                case TipoComando.Eliminar:
                    Eliminar(comando);
                    break;

                case TipoComando.Copiar:
                    Copiar(comando);
                    break;

                case TipoComando.Subir:
                    Subir(comando);
                    break;

                case TipoComando.Descargar:
                    Descargar(comando);
                    break;

                default:
                    break;
            }
        }

        private void MostrarDrives(Comando comando)
        {
            ResultadoComando resultado = new ResultadoComando();
            resultado.Comando = comando;

            try
            {
                if (comando.Path == null)
                    resultado.Carpetas = Directory.GetLogicalDrives().ToArray();
            }
            catch (Exception ex)
            {
                resultado.Error = ex.Message;
            }

            _soporteCliente.EnviarResultado(resultado);
        }

        private void Explorar(Comando comando)
        {
            ResultadoComando resultado = new ResultadoComando();
            resultado.Comando = comando;

            try
            {
                DirectoryInfo dir = new DirectoryInfo(comando.Path);
                resultado.Carpetas = dir.GetDirectories().Select(d => d.Name).ToArray();
                resultado.Archivos = dir.GetFiles().Select(f => f.Name).ToArray();
            }
            catch (Exception ex)
            {
                resultado.Error = ex.Message;
            }

            _soporteCliente.EnviarResultado(resultado);
        }

        private void Ejecutar(Comando comando)
        {
            ResultadoComando resultado = new ResultadoComando();
            resultado.Comando = comando;

            try
            {
                Process.Start(comando.Path);
            }
            catch (Exception ex)
            {
                resultado.Error = ex.Message;
            }

            _soporteCliente.EnviarResultado(resultado);
        }

        private void Eliminar(Comando comando)
        {
            ResultadoComando resultado = new ResultadoComando();
            resultado.Comando = comando;

            try
            {
                if (File.Exists(comando.Path))
                    File.Delete(comando.Path);

                if(Directory.Exists(comando.Path))
                    Directory.Delete(comando.Path);
            }
            catch (Exception ex)
            {
                resultado.Error = ex.Message;
            }

            _soporteCliente.EnviarResultado(resultado);
        }

        private void Copiar(Comando comando)
        {
            ResultadoComando resultado = new ResultadoComando();
            resultado.Comando = comando;

            try
            {
                string[] array = comando.Path.Split(new string[] { "|" }, StringSplitOptions.RemoveEmptyEntries);
                string archivoOrigen = array[0];
                string carpetaDestino = array[1];

                array = archivoOrigen.Split(new string[] { @"\" }, StringSplitOptions.RemoveEmptyEntries);
                string archivoDestino = carpetaDestino + @"\" + array[array.Length - 1];

                File.Copy(archivoOrigen, archivoDestino);
            }
            catch (Exception ex)
            {
                resultado.Error = ex.Message;
            }

            _soporteCliente.EnviarResultado(resultado);
        }

        private void Subir(Comando comando)
        {
            ResultadoComando resultado = new ResultadoComando();
            resultado.Comando = comando;

            try
            {
                string[] array = comando.Path.Split(new string[] { @"\" }, StringSplitOptions.RemoveEmptyEntries);
                string nombreArchivo = array[array.Length - 1];
                Stream archivo = _transferenciaCliente.Descargar(ref nombreArchivo);

                int leidos = 0;
                int lenght = 2048;
                byte[] buffer = new byte[lenght];

                using (FileStream writer = new FileStream(comando.Path, FileMode.CreateNew, FileAccess.Write))
                    do
                    {
                        leidos = archivo.Read(buffer, 0, lenght);
                        writer.Write(buffer, 0, leidos);
                    } while (leidos != 0);
            }
            catch (Exception ex)
            {
                resultado.Error = ex.Message;
            }

            _soporteCliente.EnviarResultado(resultado);
        }

        private void Descargar(Comando comando)
        {
            ResultadoComando resultado = new ResultadoComando();
            resultado.Comando = comando;

            try
            {
                FileInfo info = new FileInfo(comando.Path);
                FileStream stream = new FileStream(comando.Path, FileMode.Open, FileAccess.Read);

                string error = _transferenciaCliente.Subir(info.Name, stream);

                if (error != null && error.Length > 0)
                    throw new Exception(error);
            }
            catch (Exception ex)
            {
                resultado.Error = ex.Message;
            }

            _soporteCliente.EnviarResultado(resultado);
        }
    }
}
